home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / effect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  2.5 KB  |  129 lines

  1. #include "effect.h"
  2.  
  3. #ifndef NULL
  4. #define NULL ((void *) 0)
  5. #endif
  6.  
  7. #define EFFECT_MAX    32    /* エフェクト最大数 */
  8. static EFFECT effect[EFFECT_MAX];    /* ワーク */
  9. static EFFECT *effect_top,    /* 使用中のワークのリスト */
  10.  *effect_null_top;        /* 空のワークのリスト */
  11.  
  12. typedef void (*func_init) (struct _effect *);
  13. func_init FuncEffectInit[]=
  14. {
  15.     EffectInitExpl,
  16.     EffectInitExplZako,
  17.     EffectInitExplMini,
  18.     EffectInitExplPlayer,
  19.     EffectInitBombstr,
  20.     EffectInitBombstr,
  21.     EffectInitBombstr,
  22.     EffectInitHahen,
  23.     EffectInitHahenMini,
  24.     EffectInitPointsRed,
  25.     EffectInitPointsBlue,
  26.     EffectInitPoints,
  27.     EffectInitBomber,
  28.     EffectInitBackB,
  29.     EffectInitBLaser,
  30.     EffectInitTitSpark,
  31.     EffectInitTitMoji,
  32.     EffectInitLastLaser,
  33.     EffectInitLastPlayer,
  34. };
  35.  
  36.  
  37. static int points_table[]=
  38. {
  39.     100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
  40.     1200, 1500, 1800, 2000, 2500, 3000, 4000, 5000, 6000, 7000,
  41.     8000, 9000, 10000, 12000, 15000, 18000, 20000, 25000, 28000, 30000
  42. };
  43.  
  44.  
  45. /* 起動時に1度だけ呼ばれる */
  46. void EffectInit0 (void)
  47. {
  48.     int i;
  49.  
  50.     /* リストをつなげる */
  51.     effect_top = NULL;
  52.     effect_null_top = effect;
  53.     for (i = 0; i < EFFECT_MAX; i++)
  54.         effect[i].next = &effect[i + 1];
  55.  
  56.     effect[EFFECT_MAX - 1].next = NULL;
  57.  
  58.     points = &points_table[0];
  59. }
  60.  
  61.  
  62.  
  63. /* エフェクト出現時に呼ばれる */
  64. void EffectInit (short type, short type2, short x, short y)
  65. {
  66.     EFFECT *p;
  67.  
  68.     if (effect_null_top == NULL)
  69.         return;        /* 空きのワークがない(キャラクターオーバー) */
  70.  
  71.     p = effect_null_top;
  72.     effect_null_top = p->next;
  73.     p->next = effect_top;
  74.     effect_top = p;
  75.  
  76.     p->type = type;
  77.     p->type2 = type2;
  78.     p->x = x;
  79.     p->y = y;
  80.     FuncEffectInit[type] (p);    /* 初期化ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  81. }
  82.  
  83.  
  84.  
  85. /* 垂直同期ごとに呼ばれる */
  86. void EffectMove (void)
  87. {
  88.     EFFECT *p, *q;
  89.  
  90.     p = effect_top;        /* 現在注目しているワーク */
  91.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  92.     while (p != NULL) {
  93.         /* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
  94.         if ((p->func_effect_move) (p)) {    /* 返り値が非0なら消去 */
  95.             if (q == NULL) {    /* リストの一番最初を削除 */
  96.                 effect_top = p->next;
  97.                 p->next = effect_null_top;
  98.                 effect_null_top = p;
  99.                 q = NULL;
  100.                 p = effect_top;
  101.             } else {
  102.                 q->next = p->next;
  103.                 p->next = effect_null_top;
  104.                 effect_null_top = p;
  105.                 p = q->next;
  106.             }
  107.         } else {
  108.             q = p;
  109.             p = p->next;
  110.         }
  111.     }
  112. }
  113.  
  114.  
  115.  
  116. /* エフェクト消去時に呼ばれる(面クリア等) */
  117. void EffectTini (void)
  118. {
  119.     int i;
  120.  
  121.     /* リストをつなげる */
  122.     effect_top = NULL;
  123.     effect_null_top = effect;
  124.     for (i = 0; i < EFFECT_MAX; i++)
  125.         effect[i].next = &effect[i + 1];
  126.  
  127.     effect[EFFECT_MAX - 1].next = NULL;
  128. }
  129.